#include "work_task.h"

void WorkTask::enqueue_task(FuncVoid func)
{
    MutexLockGuard lock(task_queue_mutex_);
    task_count_++;
    // task_queue_.emplace_back(func);
    task_queue_.emplace_back([call = std::move(func), this](){
        call();
        {
            MutexLockGuard lock(task_queue_mutex_);
            task_count_--;
            // 支持外部线程感知队列空闲状态
            // 所有任务执行完成
            if (task_count_ == 0)
                task_queue_cv_.notify_all();
        }
    });
    // 避免消费者线程因等待而延迟处理任务
    // 新任务入队
    task_queue_cv_.notify_all();
}

void WorkTask::work_task_loop()
{  
    while (1)
    {
        // 获取锁，防止多个任务线程对同一个任务队列进行写操作时产生冲突，RAII 获取资源即初始化
        MutexUniqueLock lock(task_queue_mutex_);
        // 等待条件变量，如果条件变量不满足，就一直等待，直到条件变量满足
        task_queue_cv_.wait(lock, [this](){
            return !task_queue_.empty();
        });
        // 零拷贝获取任务队列
        ListFunction new_task_queue = std::move(task_queue_);
        // 释放锁，这里手动释放锁，是为了加快任务队列的释放，提高性能
        lock.unlock();
        // 遍历任务队列
        for (FuncVoid &task : new_task_queue)
        {
            task();
        }

        vTaskDelay(1000 / portTICK_PERIOD_MS);
        printf("work task loop\n");
    }
}

WorkTask::WorkTask(uint32_t stack_size)
{
    xTaskCreate([](void *pvParameters){
        WorkTask *work_task = static_cast<WorkTask*>(pvParameters);
        work_task->work_task_loop();
        vTaskDelete(NULL); 
    }, "work_task", stack_size, this, 3, NULL);
}

WorkTask::~WorkTask()
{
}